<?php
/**
* 名称：安全验证"基要"类。
* 描述：该类的功能是验证用户基本登录权限，在具体的子系统中验证时，如果子系统给出系统证书ID将验证用户是否有授权，超级管理员自动通过。
* 描述：构造函数实现的是默认验证方法，该方法是使用最多的，所以默认实现，供子控制器继承。在特殊情况下，可以选择不继承该默认构造方法。
* 描述：如子系统中的"主面板控制器index"都是实现自己的构造函数，对冲掉这个默认的实现，因为"主面板控制器"的业务逻辑确实需要这样的实现。
*/
abstract class Controller_Security extends Controller{
    /**
    * 描述：安全验证类型常值之常规。
    */
    const SECURITY_TYPE_VALUE_COMMON='COMMON';

    /**
    * 描述：安全验证类型常值之主面板。
    */
    const SECURITY_TYPE_VALUE_MAIN='MAIN';

    /**
    * 描述：安全验证类型，指示安全验证程序执行相关验证子程序。
    */
    protected $SecurityType=self::SECURITY_TYPE_VALUE_COMMON;

    /**
    * 描述：通用的安全验证逻辑，子系统可根据需要“重载”。
    */
    public function __Construct($method){
        if(Model_Account::IsLogin()){
            $license=$this->__License();
            #验证授权，如果$license值为NULL，Model_Account::IsLicense就会验证是否有超级管理员权限的。
            if($license){
                if(Model_Account::IsLicense($license)!==TRUE){
                    $this->__NoLicense();
                }
            }
        }
        else{
            $this->__NoLogin();
        }
        #如果设置了权限方法，则检查是否有权限。
        $permission=$this->__Permission();
        if(Model_License::CheckPermission($permission)!==TRUE){
            $this->__NoPermission();
        }
        #构行控制器。
        parent::__Construct($method);
    }

    /**
    * 描述：获取授权原型方法，由控制器根据需要重载。
    */
    protected function __License(){}

    /**
    * 描述：获取授权原型方法，由控制器根据需要重载。
    */
    protected function __Permission(){}

    /**
    * 描述：默认的“当没有登录或登录超时”要执行的程序，子系统可根据需要“重载”。
    */
    private function __NoLogin(){
        if($this->SecurityType===self::SECURITY_TYPE_VALUE_MAIN){
            header(sprintf('location:%s',Route::GenerateURI(array('controller'=>'login'))));
        }
        else{
            exit(json_encode(array(
                'statusCode'=>'301',
                'message'=>'会话超时，请重新登录。',
                'navTabId'=>'',
                'callbackType'=>'',
                'forwardUrl'=>''
            )));
        }
    }

    /**
    * 描述：默认的“当没有授权时”要执行的程序，子系统可根据需要“重载”。
    */
    private function __NoLicense(){
        if($this->SecurityType===self::SECURITY_TYPE_VALUE_MAIN){
            Model_Account::Logout();
            Template::Assign('Message','授权错误，登录失败。');
            Template::Display('error.html');
        }
        else{
            exit(json_encode(array(
                'statusCode'=>'300',
                'message'=>'授权不足，访问失败。',
                'navTabId'=>'',
                'callbackType'=>'closeCurrent',
                'forwardUrl'=>''
            )));
        }
    }

    /**
    * 描述：处理权限不足的情况。
    */
    private function __NoPermission(){
        exit(json_encode(array(
            'statusCode'=>'300',
            'message'=>'权限不足，访问失败。',
            'navTabId'=>'',
            'callbackType'=>'closeCurrent',
            'forwardUrl'=>''
        )));
    }
}
?>